package com.platform.common.menus;

import lombok.Getter;
import org.apache.commons.lang3.StringUtils;

import java.util.Objects;

/**
 * describe:平台配置枚举
 * 组合枚举
 * @author Administrator
 * @date 2020/04/28
 * @Time 22:51
 */
public interface SysConfigEnum {

    /**
     * 编码
     */
    enum Code implements SysConfigEnum{
        /**
         * 编码
         */
        PLATFORM("platform");

        private String value;

        Code(String value){
            this.value = value;
        }

        public static String getValue(){
            return PLATFORM.value;
        }
    }

    /**
     * 继承关系
     */
    enum RoleInheritance implements SysConfigEnum {
        /**
         * 受限继承
         * 受角色所在角色组限制，只能继承角色组所有拥有的权限
         */
        LIMITED("Limited"),
        /**
         * 一般继承
         * 不受角色所在角色组限制，能继承不在角色组下的权限
         */
        GENERAL("General");

        @Getter
        private String value;

        RoleInheritance(String value){
            this.value =value;
        }

        public static RoleInheritance getEnumByValue(String value){
            if (StringUtils.isNotEmpty(value)){
                for (RoleInheritance roleInheritance: values()) {
                    if (Objects.equals(roleInheritance.value, value)){
                        return roleInheritance;
                    }
                }
            }
            return null;
        }
    }

    /**
     * 职责分离
     */
    enum SeparationOfDuty implements SysConfigEnum {
        /**
         * 静态职责分离
         * 当角色授权给用户时，需要判断当前用户是否被赋予了一个与新角色冲突的角色，冲突的角色位一个二元关系，任何一个用户在此场景下只能拥有其中一个角色
         */
        SSD("SSD"),
        /**
         * 动态职责分离
         * 在角色分配时可以将冲突的角色赋予给同一个用户，但是在用户使用系统时，一次会话中不能同时激活两个角色
         */
        DSD("DSD");

        @Getter
        private String value;

        SeparationOfDuty(String value){
            this.value =value;
        }

        public static SeparationOfDuty getEnumByValue(String value){
            if (StringUtils.isNotEmpty(value)){
                for (SeparationOfDuty separationOfDuty: values()) {
                    if (Objects.equals(separationOfDuty.value, value)){
                        return separationOfDuty;
                    }
                }
            }
            return null;
        }
    }

    /**
     * 权限颗粒
     */
    enum PermissionGrain implements SysConfigEnum {
        /**
         * 权限颗粒– 功能菜单权限
         * 粗力度权限控制，获得当前权限后页面所有数据可查看或操作
         */
        MENU("Menu"),
        /**
         * 权限颗粒– 功能操作权限
         * 比菜单权限更细化，具象到不同角色即使看到相同数据，所具备的操作管理权限也不一样
         */
        OPERATION("Operation"),
        /**
         * 权限颗粒– 数据字段权限
         * 最细颗粒的权限控制，实现了不同角色进入后，看到的数据字段都会不同。
         */
        DATA("Data");

        @Getter
        private String value;

        PermissionGrain(String value){
            this.value =value;
        }

        public static PermissionGrain getEnumByValue(String value){
            if (StringUtils.isNotEmpty(value)){
                for (PermissionGrain permissionGrain: values()) {
                    if (Objects.equals(permissionGrain.value, value)){
                        return permissionGrain;
                    }
                }
            }
            return null;
        }
    }

}
